﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using GestorDocument.Model.IRepository;
using GestorDocument.Model;
using System.Collections.ObjectModel;
using System.Configuration;

namespace GestorDocument.ViewModel.PantallaInicio
{
    public class PantallaInicioViewModel :ViewModelBase
    {
        long idRol = 10;
        long idAtendido = 20130611180608439;
        long idUrgente = 20130611175650143;
        long idPendiente = 20130611180545475;
        long idOrdinario = 20130611175614758;
        long idPrioritarios = 20130611175702903;

        public int RowHeightTitulo
        {
            get { return _RowHeightTitulo; }
            set
            {
                if (_RowHeightTitulo != value)
                {
                    _RowHeightTitulo = value;
                    OnPropertyChanged(RowHeightTituloPropertyName);
                }
            }
        }
        private int _RowHeightTitulo;
        public const string RowHeightTituloPropertyName = "RowHeightTitulo";

        public int RangoFecha
        {
            get { return _RangoFecha; }
            set
            {
                if (_RangoFecha != value)
                {
                    _RangoFecha = value;
                    OnPropertyChanged(RangoFechaPropertyName);
                }
            }
        }
        private int _RangoFecha;
        public const string RangoFechaPropertyName = "RangoFecha";

        public UsuarioModel Usuario
        {
            get { return _Usuario; }
            set
            {
                if (_Usuario != value)
                {
                    _Usuario = value;
                    OnPropertyChanged(UsuarioPropertyName);
                }
            }
        }
        private UsuarioModel _Usuario;
        public const string UsuarioPropertyName = "Usuario";
        // ***************************** ***************************** *****************************
        // Repository.
        private IAsunto _AsuntoRepository;
        public MainWindowViewModel _MainWindowViewModel;
        public AsuntoModel SelectedAsunto
        {
            get { return _SelectedAsunto; }
            set
            {
                if (_SelectedAsunto != value)
                {
                    _SelectedAsunto = value;
                    OnPropertyChanged(SelectedAsuntoPropertyName);
                }
            }
        }
        private AsuntoModel _SelectedAsunto;
        public const string SelectedAsuntoPropertyName = "SelectedAsunto";

        // ***************************** ***************************** *****************************
        // Coleccion para extraer los datos para el grid. TODOS LOS ASUNTOS
        public ObservableCollection<AsuntoModel> AuxTodosAsuntos
        {
            get { return _AuxTodosAsuntos; }
            set
            {
                if (_AuxTodosAsuntos != value)
                {
                    _AuxTodosAsuntos = value;
                    OnPropertyChanged(AuxTodosAsuntosPropertyName);
                }
            }
        }
        private ObservableCollection<AsuntoModel> _AuxTodosAsuntos;
        public const string AuxTodosAsuntosPropertyName = "AuxTodosAsuntos";

        // ***************************** ***************************** *****************************
        // Coleccion para extraer los datos para el grid. TODOS LOS ASUNTOS
        public ObservableCollection<AsuntoModel> TodosAsuntos
        {
            get { return _TodosAsuntos; }
            set
            {
                if (_TodosAsuntos != value)
                {
                    _TodosAsuntos = value;
                    OnPropertyChanged(TodosAsuntosPropertyName);
                }
            }
        }
        private ObservableCollection<AsuntoModel> _TodosAsuntos;
        public const string TodosAsuntosPropertyName = "TodosAsuntos";

        public int CountTodos
        {
            get { return _CountTodos; }
            set
            {
                if (_CountTodos != value)
                {
                    _CountTodos = value;
                    OnPropertyChanged(CountTodosPropertyName);
                }
            }
        }
        private int _CountTodos;
        public const string CountTodosPropertyName = "CountTodos";

        // ***************************** ***************************** *****************************
        // Coleccion para extraer los datos para el grid. LOS ASUNTOS ATENDIDOS
        public ObservableCollection<AsuntoModel> AtendidosAsuntos
        {
            get { return _AtendidosAsuntos; }
            set
            {
                if (_AtendidosAsuntos != value)
                {
                    _AtendidosAsuntos = value;
                    OnPropertyChanged(AtendidosAsuntosPropertyName);
                }
            }
        }
        private ObservableCollection<AsuntoModel> _AtendidosAsuntos;
        public const string AtendidosAsuntosPropertyName = "AtendidosAsuntos";

        public int CountAtendidos
        {
            get { return _CountAtendidos; }
            set
            {
                if (_CountAtendidos != value)
                {
                    _CountAtendidos = value;
                    OnPropertyChanged(CountAtendidosPropertyName);
                }
            }
        }
        private int _CountAtendidos;
        public const string CountAtendidosPropertyName = "CountAtendidos";

        // ***************************** ***************************** *****************************
        // Coleccion para extraer los datos para el grid. LOS ASUNTOS URGENTES
        public ObservableCollection<AsuntoModel> AsuntosVencidos
        {
            get { return _AsuntosVencidos; }
            set
            {
                if (_AsuntosVencidos != value)
                {
                    _AsuntosVencidos = value;
                    OnPropertyChanged(AsuntosVencidosPropertyName);
                }
            }
        }
        private ObservableCollection<AsuntoModel> _AsuntosVencidos;
        public const string AsuntosVencidosPropertyName = "AsuntosVencidos";

        public int CountAsuntosVencidos
        {
            get { return _CountAsuntosVencidos; }
            set
            {
                if (_CountAsuntosVencidos != value)
                {
                    _CountAsuntosVencidos = value;
                    OnPropertyChanged(CountAsuntosVencidosPropertyName);
                }
            }
        }
        private int _CountAsuntosVencidos;
        public const string CountAsuntosVencidosPropertyName = "CountAsuntosVencidos";

        // ***************************** ***************************** *****************************
        // Coleccion para extraer los datos para el grid. LOS ASUNTOS PRIORITARIOS
        public ObservableCollection<AsuntoModel> AsuntosPorVencer
        {
            get { return _AsuntosPorVencer; }
            set
            {
                if (_AsuntosPorVencer != value)
                {
                    _AsuntosPorVencer = value;
                    OnPropertyChanged(AsuntosPorVencerPropertyName);
                }
            }
        }
        private ObservableCollection<AsuntoModel> _AsuntosPorVencer;
        public const string AsuntosPorVencerPropertyName = "AsuntosPorVencer";

        public int CountAsuntosPorVencer
        {
            get { return _CountAsuntosPorVencer; }
            set
            {
                if (_CountAsuntosPorVencer != value)
                {
                    _CountAsuntosPorVencer = value;
                    OnPropertyChanged(CountAsuntosPorVencerPropertyName);
                }
            }
        }
        private int _CountAsuntosPorVencer;
        public const string CountAsuntosPorVencerPropertyName = "CountAsuntosPorVencer";

        // ***************************** ***************************** *****************************
        // Coleccion para extraer los datos para el grid. LOS ASUNTOS EN BORRADOR
        public ObservableCollection<AsuntoModel> BorradorAsuntos
        {
            get { return _BorradorAsuntos; }
            set
            {
                if (_BorradorAsuntos != value)
                {
                    _BorradorAsuntos = value;
                    OnPropertyChanged(BorradorAsuntosPropertyName);
                }
            }
        }
        private ObservableCollection<AsuntoModel> _BorradorAsuntos;
        public const string BorradorAsuntosPropertyName = "BorradorAsuntos";

        public int CountBorrador
        {
            get { return _CountBorrador; }
            set
            {
                if (_CountBorrador != value)
                {
                    _CountBorrador = value;
                    OnPropertyChanged(CountBorradorPropertyName);
                }
            }
        }
        private int _CountBorrador;
        public const string CountBorradorPropertyName = "CountBorrador";

        public string TextBorrador
        {
            get { return _TextBorrador; }
            set
            {
                if (_TextBorrador != value)
                {
                    _TextBorrador = value;
                    OnPropertyChanged(TextBorradorPropertyName);
                }
            }
        }
        private string _TextBorrador;
        public const string TextBorradorPropertyName = "TextBorrador";

        // ***************************** ***************************** *****************************
        // Coleccion para extraer los datos para el grid. LOS ASUNTOS FUERA DE LA FECHA LIMITE
        public ObservableCollection<AsuntoModel> AsuntosFueraFechaLimite
        {
            get { return _AsuntosFueraFechaLimite; }
            set
            {
                if (_AsuntosFueraFechaLimite != value)
                {
                    _AsuntosFueraFechaLimite = value;
                    OnPropertyChanged(AsuntosFueraFechaLimitePropertyName);
                }
            }
        }
        private ObservableCollection<AsuntoModel> _AsuntosFueraFechaLimite;
        public const string AsuntosFueraFechaLimitePropertyName = "AsuntosFueraFechaLimite";

        public int CountFueraFechaLimite
        {
            get { return _CountFueraFechaLimite; }
            set
            {
                if (_CountFueraFechaLimite != value)
                {
                    _CountFueraFechaLimite = value;
                    OnPropertyChanged(CountFueraFechaLimitePropertyName);
                }
            }
        }
        private int _CountFueraFechaLimite;
        public const string CountFueraFechaLimitePropertyName = "CountFueraFechaLimite";

        // ***************************** ***************************** *****************************
        // Coleccion para extraer los datos para el grid. LOS ASUNTOS DETRO DE LA FECHA LIMITE
        public ObservableCollection<AsuntoModel> AsuntosDetroFechaLimite
        {
            get { return _AsuntosDetroFechaLimite; }
            set
            {
                if (_AsuntosDetroFechaLimite != value)
                {
                    _AsuntosDetroFechaLimite = value;
                    OnPropertyChanged(AsuntosDetroFechaLimitePropertyName);
                }
            }
        }
        private ObservableCollection<AsuntoModel> _AsuntosDetroFechaLimite;
        public const string AsuntosDetroFechaLimitePropertyName = "AsuntosDetroFechaLimite";

        public int CountDetroFechaLimite
        {
            get { return _CountDetroFechaLimite; }
            set
            {
                if (_CountDetroFechaLimite != value)
                {
                    _CountDetroFechaLimite = value;
                    OnPropertyChanged(CountDetroFechaLimitePropertyName);
                }
            }
        }
        private int _CountDetroFechaLimite;
        public const string CountDetroFechaLimitePropertyName = "CountDetroFechaLimite";

        // ***************************** ***************************** *****************************
        // Constructor y carga de elementos.
        public PantallaInicioViewModel(MainWindowViewModel mainWindowViewModel)
        {
            this._MainWindowViewModel = mainWindowViewModel;
            this.Usuario = mainWindowViewModel.Usuario;
            this._AsuntoRepository = new GestorDocument.DAL.Repository.AsuntoRepository();

            this.RangoFecha = Int32.Parse(ConfigurationManager.AppSettings["RangoFecha"].ToString());

            this.LoadInfoGrid();
        }

        public void LoadInfoGrid()
        {
            this._AuxTodosAsuntos = new ObservableCollection<AsuntoModel>();
            this.TodosAsuntos = new ObservableCollection<AsuntoModel>();
            this.AsuntosPorVencer = new ObservableCollection<AsuntoModel>();
            this.AsuntosVencidos = new ObservableCollection<AsuntoModel>();
            this.AtendidosAsuntos = new ObservableCollection<AsuntoModel>();
            this.BorradorAsuntos = new ObservableCollection<AsuntoModel>();
            this.AsuntosDetroFechaLimite = new ObservableCollection<AsuntoModel>();
            this.AsuntosFueraFechaLimite = new ObservableCollection<AsuntoModel>();
 
            //TRAE TODOS LOS ASUNTOS DE LA BASE
            this.AuxTodosAsuntos = this._AsuntoRepository.GetAsuntos(this.Usuario.Rol) as ObservableCollection<AsuntoModel>;

            this.AuxTodosAsuntos.OrderByDescending(f=> f.FechaCreacion).ToList().ForEach(p=>
            {
                //TODOS
                if (!p.IsBorrador)
                    this.TodosAsuntos.Add(p);
            });

            this.CountTodos= this.TodosAsuntos.Count;
            this.RowHeightTitulo = 1;
            //valida dependiendo el rol 
            this.GetValidedBorrador();
        }

        public void GetValidedBorrador()
        {
            //Direcciones y areas
            if (idRol != this.Usuario.Rol.IdRol)
            {
                this.RowHeightTitulo = 0;
                //this.RowHeight = 0;
                this.TodosAsuntos.OrderByDescending(f => f.FechaCreacion).ToList().ForEach(p =>
                {
                    if (p.Turno != null)
                    {
                        //ATENDIDOS
                        if (p.IdStatusAsunto == idAtendido &&
                           !p.IsBorrador)
                            this.AtendidosAsuntos.Add(p);

                        //asuntos vencidos
                        if (p.FechaAtendido != null)
                        {
                            DateTime fechaVencimiento = DateTime.Parse(string.Format("{0:dd/MM/yyyy}", p.FechaVencimiento));
                            DateTime fechaAtendido = DateTime.Parse(string.Format("{0:dd/MM/yyyy}", p.FechaAtendido));
                            
                            if (fechaVencimiento < fechaAtendido &&
                                p.IdStatusAsunto == idAtendido &&
                                !p.IsBorrador)
                                this.AsuntosVencidos.Add(p);
                        }
                        else
                        {
                            DateTime fechaVencimiento = DateTime.Parse(string.Format("{0:dd/MM/yyyy}", p.FechaVencimiento));
                            DateTime fechaSistema = DateTime.Parse(string.Format("{0:dd/MM/yyyy}", DateTime.Now));
                            //asuntos vencidos
                            if (fechaVencimiento < fechaSistema && !p.IsBorrador)
                                this.AsuntosVencidos.Add(p);
                        }

                        //asuntos por vencer
                        if (p.FechaAtendido == null)
                        {
                            DateTime fechaVencimiento = DateTime.Parse(string.Format("{0:dd/MM/yyyy}", p.FechaVencimiento));
                            DateTime fechaRangoInicio = DateTime.Parse(string.Format("{0:dd/MM/yyyy}", DateTime.Now));
                            //DateTime fechRangoFinal = this.GetRangoFechaFinal();

                            //detro de la fecha limite
                            if ((fechaVencimiento >= fechaRangoInicio) && /*fechaVencimiento <= fechRangoFinal &&*/
                                !p.IsBorrador)
                                this.AsuntosPorVencer.Add(p);
                        }
                        
                    }
                });
                
                (from p in this.TodosAsuntos
                 orderby p.FechaCreacion descending
                 where 
                 (
                    p.Turno != null ? p.Turno.IsBorrador: false
                 )
                 select p).ToList().ForEach(o => this.BorradorAsuntos.Add(o));
               
                this.CountBorrador = this.BorradorAsuntos.Count;

                this.TextBorrador = "( " + this.CountBorrador + " )";

                (from m in this._MainWindowViewModel.Menus.Menu
                 where m.MenuName == "Borrador"
                 select m).ToList().ForEach(o => o.CountBorrador = this.TextBorrador);

                this.CountAtendidos = this.AtendidosAsuntos.Count;
                this.CountAsuntosVencidos = this.AsuntosVencidos.Count;
                this.CountAsuntosPorVencer = this.AsuntosPorVencer.Count;

            }
            else
            {
                this.RowHeightTitulo = 30;
                //Borrador oficialia 
                this.AuxTodosAsuntos.OrderByDescending(f => f.FechaCreacion).ToList().ForEach(p =>
                {
                    //BORRADOR
                    if (p.IsBorrador)
                        this.BorradorAsuntos.Add(p);
                    //ATENDIDOS
                    if (p.IdStatusAsunto == idAtendido &&
                       !p.IsBorrador)
                        this.AtendidosAsuntos.Add(p);

                    //asuntos vencidos
                    if (p.FechaAtendido != null)
                    {
                        DateTime fechaVencimiento = DateTime.Parse(string.Format("{0:dd/MM/yyyy}", p.FechaVencimiento));
                        DateTime fechaAtendido = DateTime.Parse(string.Format("{0:dd/MM/yyyy}", p.FechaAtendido)); 
                        //asuntos vencidos
                        if (fechaVencimiento < fechaAtendido &&
                            p.IdStatusAsunto == idAtendido &&
                            !p.IsBorrador)
                            this.AsuntosVencidos.Add(p);
                    }
                    else
                    {
                        DateTime fechaVencimiento = DateTime.Parse(string.Format("{0:dd/MM/yyyy}", p.FechaVencimiento));
                        DateTime fechaSistema = DateTime.Parse(string.Format("{0:dd/MM/yyyy}", DateTime.Now));
                        //asuntos vencidos
                        if (fechaVencimiento < fechaSistema && !p.IsBorrador)
                            this.AsuntosVencidos.Add(p);
                    }

                    //asuntos por vencer
                    if (p.FechaAtendido == null)
                    {
                        DateTime fechaVencimiento = DateTime.Parse(string.Format("{0:dd/MM/yyyy}", p.FechaVencimiento));
                        DateTime fechaRangoInicio = DateTime.Parse(string.Format("{0:dd/MM/yyyy}", DateTime.Now));
                        //DateTime fechRangoFinal = this.GetRangoFechaFinal();
                        
                        //detro de la fecha limite
                        if ((fechaVencimiento >= fechaRangoInicio) && /*fechaVencimiento <= fechRangoFinal &&*/
                            !p.IsBorrador)
                            this.AsuntosPorVencer.Add(p);
                    }

                });

                this.CountBorrador = this.BorradorAsuntos.Count;
                
                this.TextBorrador = "( " + this.CountBorrador + " )";

                (from m in this._MainWindowViewModel.Menus.Menu
                 where m.MenuName == "Borrador"
                 select m).ToList().ForEach(o => o.CountBorrador = this.TextBorrador);

                this.CountAtendidos = this.AtendidosAsuntos.Count;
                this.CountAsuntosVencidos = this.AsuntosVencidos.Count;
                this.CountAsuntosPorVencer = this.AsuntosPorVencer.Count;
            }

        }

        public DateTime GetRangoFechaFinal()
        {
            DateTime rangoFechaFinal = DateTime.Now;

            rangoFechaFinal = rangoFechaFinal.AddDays(this.RangoFecha);

            return rangoFechaFinal;
        }

    }
}
